package utils;

import cn.hutool.core.date.DateUtil;
import io.jsonwebtoken.*;

import java.util.Date;
import java.util.Map;
import java.util.UUID;

public class JwtUtil {
    /**
     * 密钥，用于signature（签名）部分解密 -- 暗语（口令） -- 盐值
     */
    private static final String KEY = "112233abc" ;

    /**
     * 签发者
     */
    private static final String ISS = "edu.nf";


    /**
     * 创建 Jwt 令牌字符串
     * @param claims 签署内容
     * @param ttl 设置过期时间，单位毫秒 - 1 * 24 * 60 * 60 * 1000
     * @return
     */
    public static String createToken(Map<String, Object> claims, long ttl) {
        JwtBuilder builder = Jwts.builder()
                // 获取签名秘钥，并采用HS256算法对JWT进行的签名
                .signWith(SignatureAlgorithm.HS256,KEY)
                //jwt唯一标识
                .setId(UUID.randomUUID().toString())
                //设置需要签署的内容
                .setClaims(claims)
                //设置发证人
                .setIssuer(ISS)
                //主题
                .setSubject("JWT_AUTH")
                //签名时间
                .setIssuedAt(new Date());
        // 过期时间
        if(ttl >= 0){
            builder.setExpiration(getExpDate(ttl));
        }
        return builder.compact();
    }

    /**
     * 创建token过期时间
     * @param ttl
     * @return
     */
    private static Date getExpDate(long ttl){
        Date expDate = DateUtil.date(System.currentTimeMillis() + ttl);
        return expDate;
    }

    /**
     * 验证Token是否正确
     */
    public static void verify(String token){
        try {
            Jwts.parser().setSigningKey(KEY).parseClaimsJws(token);
        } catch (SecurityException e) {
            throw new RuntimeException("Invalid JWT signature.");
        } catch (MalformedJwtException e) {
            throw new RuntimeException("Invalid JWT token.");
        } catch (ExpiredJwtException e) {
            throw new RuntimeException("JWT令牌字符串过期.");
        } catch (UnsupportedJwtException e) {
            throw new RuntimeException("Unsupported JWT.");
        } catch (IllegalArgumentException e) {
            throw new RuntimeException("JWT token compact of handler are invalid.");
        }
    }

    /**
     * 获取payload的内容
     * @param token
     * @param name
     * @param type
     * @param <T>
     * @return
     */
    public static <T> T getPayload(String token,String name,Class<T> type) {
        return Jwts.parser()
                .setSigningKey(KEY)
                .parseClaimsJws(token)
                .getBody()
                .get(name, type);

    }
}
